package com.ruoyi.project.tool;

import cn.hutool.core.util.StrUtil;
import com.ruoyi.project.common.domain.dto.WxFormIdDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 小程序推送码收集获取工具---（已废弃 2020年1月10号以后不需要在收集）
 */
@Component
public class MiniAppUtils {
    @Autowired
    public RedisTemplate redisTemplate;

    //推送码缓存前缀
    private final String formIdKey = "FORMIDLIST_{}";
    //失效时间（毫秒）
    private final long expire = 604740000;//官方时限是7天也就是604800000毫秒  这里设置604740000是差60秒不到7天
    //缓存数量长度
    private final long limit = 20;

    /**
     * 保存formId
     * @param openId
     * @param formId
     */
    public void saveFormId(String openId,String formId){
        String redisKey = StrUtil.format(formIdKey,openId);
        if(redisTemplate.hasKey(redisKey)){
            //检查过期推送码
            filterExpireFormId(openId);
            // 判断存放数量是否超限 //存储推送码
            if(redisTemplate.opsForList().size(redisKey)>=limit){
                //移除最右边val
                redisTemplate.opsForList().remove(redisKey,-1,redisTemplate.opsForList().rightPop(redisKey));
                //从左边插入
                redisTemplate.opsForList().leftPush(redisKey,new WxFormIdDto(formId,System.currentTimeMillis()+expire));
            }else {
                //从左边插入
                redisTemplate.opsForList().leftPush(redisKey,new WxFormIdDto(formId,System.currentTimeMillis()+expire));
            }
        }else {
            //从左边插入
            redisTemplate.opsForList().leftPush(StrUtil.format(formIdKey,openId),new WxFormIdDto(formId,System.currentTimeMillis()+expire));
        }
    };

    /**
     * 取出有效的formId  不存在返回“”
     * @param openId
     * @return
     */
    public String getFormId(String openId){
        String redisKey = StrUtil.format(formIdKey,openId);
        //检查失效码
        filterExpireFormId(openId);
        //取出有效码
        if(redisTemplate.opsForList().size(redisKey) > 0){
          //最右取出
            WxFormIdDto w = (WxFormIdDto) redisTemplate.opsForList().rightPop(redisKey);
            return w.getFormId();
        }
        return "";
    }

    /**
     * 过滤失效的推送码
     * @param openId
     */
    private void filterExpireFormId(String openId){
        String redisKey = StrUtil.format(formIdKey,openId);
        List<WxFormIdDto> list = redisTemplate.opsForList().range(redisKey,0,-1);
        for (WxFormIdDto wfd:list){
            if(wfd.getExpire() <= System.currentTimeMillis()){//小于当前时间的失效
                redisTemplate.opsForList().remove(redisKey,-1,wfd);
            }
        }
    }
}
